package com.hd123.rumba.gwt.widget2.client.misc;

import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;

/**
 * 进度条
 * 
 * @author LiQi
 * 
 */
public class RProgressBar extends AbsolutePanel {

  /** 样式 */
  public static final String STYLENAME = "rb-ProgressBar";
  public static final String STYLENAME_TEXT = "rb-ProgressBar-text";
  public static final String STYLENAME_BAR = "rb-ProgressBar-bar";

  /** 进度条上显示的文本 */
  private HTML text;

  /** 进度条 */
  private HTML bar;

  /** position范围的最小值 */
  private int min = 0;

  /** position范围的最大值 */
  private int max = 100;

  /** 每次步进的长度 */
  private int stepSize = 1;

  /** 当前进度位置，介于min和max构成的闭区间内 */
  private int position = 0;

  public RProgressBar() {
    super();

    setStyleName(STYLENAME);
    setHeight("20px");

    bar = new HTML("");
    bar.setHeight("100%");
    bar.setStyleName(STYLENAME_BAR);
    add(bar);

    HorizontalPanel textFrame = new HorizontalPanel();
    textFrame.setWidth("100%");
    textFrame.setHeight("100%");
    add(textFrame, 0, 0);

    text = new HTML();
    text.setWidth("100%");
    text.setHorizontalAlignment(HasAlignment.ALIGN_CENTER);
    text.setStyleName(STYLENAME_TEXT);
    textFrame.add(text);
    textFrame.setCellVerticalAlignment(text, HasAlignment.ALIGN_MIDDLE);

    reset();
  }

  /**
   * position范围de的最小值，默认为0
   * 
   * @return
   */
  public int getMin() {
    return min;
  }

  /**
   * 设置position范围de的最小值
   * 
   * @param min
   */
  public void setMin(int min) {
    min = min > max ? max : min;
    this.min = min;
    reset();
  }

  /**
   * position范围的最大值，默认为100
   * 
   * @return
   */
  public int getMax() {
    return max;
  }

  /**
   * 设置position范围的最大值
   * 
   * @param max
   */
  public void setMax(int max) {
    max = max < min ? min : max;
    this.max = max;
    reset();
  }

  /**
   * 每次步进的长度，默认为1
   * 
   * @return
   */
  public int getStepSize() {
    return stepSize;
  }

  /**
   * 设置每次步进的长度
   * 
   * @param stepSize
   */
  public void setStepSize(int stepSize) {
    this.stepSize = stepSize;
  }

  /**
   * 当前进度位置，介于min和max构成的闭区间内。
   * 
   * @return
   */
  public int getPosition() {
    return position;
  }

  /**
   * 设置当前进度位置，也可通过step方法达到同样的效果
   * 
   * @param position
   */
  public void setPosition(int position) {
    position = position > max ? max : position;
    position = position < min ? min : position;
    this.position = position;
    refreshProgress();
  }

  /**
   * 增加进度
   * 
   * @param size
   *          增加的长度，不受stepSize的限制。为负数时后退
   */
  public void step(int size) {
    setPosition(position + size);
  }

  /**
   * 前进一步，增加的长度由stepSize决定
   * 
   */
  public void step() {
    step(stepSize);
  }

  /**
   * 后退一步，减少的长度由stepSize决定
   * 
   */
  public void stepBack() {
    step(-stepSize);
  }

  /**
   * 重置进度条，恢复到初始状态
   * 
   */
  public void reset() {
    setPosition(min);
  }

  /**
   * 是否进度已达100%
   * 
   * @return
   */
  public boolean isFinish() {
    return position == max;
  }

  /**
   * 是否显示进度的百分比
   * 
   * @return
   */
  public boolean isShowPercent() {
    return text.isVisible();
  }

  /**
   * 设置是否显示进度的百分比
   * 
   * @param showPercent
   */
  public void setShowPercent(boolean showPercent) {
    text.setVisible(showPercent);
  }

  /**
   * 刷新进度显示
   * 
   */
  private void refreshProgress() {
    double percent = (position - min) * 1.0 / (max - min) * 100;
    bar.setWidth(NumberFormat.getFormat("0.0").format(percent) + "%");
    text.setText(NumberFormat.getFormat("0").format(percent) + "%");
  }
}
